// 不安全rust
// rust隐藏了第二个语言：没有强制内存安全保证（unsafe rust）
// 和普通rust一样但提供额外的超能力
// unsafe关键字
// 1.解引用原始指针：可变*mut T，不可变*const T，作用（与c语言进行接口，构建借用检查器无法理解的安全抽象）
// 1.1允许通过同时具备不可变和可变指针或者多个指向同一位置的可变指针来忽略借用规则
// 1.2无法保证能指向合理的内存
// 1.3允许为null
// 1.4不实现任何自动清理
// 2.调用unsafe函数或者方法
// 2.1extern关键字调用外部方法或者暴露接口给外部调用
// 3.访问或者修改可变的静态变量
// 3.1rust支持全局变量，但因为所有权机制可能产生某些问题如数据竞争（多线程），全局变量又叫做静态变量（static）
// 3.2修改静态变量是不安全的
// 4.实现unsafe trait

// 高级trait
// 关联类型的trait（有点像泛型ts里面的type）
// 默认泛型参数和运算符重载
// 完全限定语法
// supertrait来要求trait附带其他trait的类型
// newtype模式在外部类型上实现外部的trait 

// 使用newtype模式实现类型安全和抽象
// rust类型别名创建类型同义词（类似ts抽离type类型）
// never类型（空类型）
// 动态大小和Sized trait
// str是动态大小的类型（不是&str），只有运行时才能确定字符串的长度
// ?Sized trait解除约束

// 高级函数和闭包
// 函数指针（fn类型）与闭包的不同
// 返回闭包：闭包使用trait进行表达，无法在函数中直接返回一个闭包，可以将一个实现了该trait的具体类型作为返回值

// 宏macro：rust里指的是一组相关特性的集合称谓（类似babel的ast个人理解：有点类似自己编译自己的rust代码）
// 使用macro_rules!（可能被弃用）关键字构建声明宏
// #[macro_export] // 表示该宏被引入当前作用域
// #[some_attribute] // 代表过程宏
// 函数和宏的差别：宏是用来生成其他代码的代码（元编程），编译器会在解释代码前展开宏，宏比函数复杂，在某个文件调用宏，需提前定义宏或者将宏引入当前区域
// 基于属性来生成代码的过程宏（更像函数）

static mut HELLO_WORLD: &str = "hello world";

unsafe trait Foo {
    
}

unsafe impl Foo for i32 {
    
}

unsafe fn dange() {}

#[no_mangle] // 编译时候不改变名称
pub extern "C" fn call_from_c() {
    println!("hello")
}

fn main() {
    let mut num = 5;
    let r1 = &num as *const i32;
    let r2 = &mut num as *mut i32;
    unsafe {
        println!("{}", *r1);
        println!("{}", *r2);
        dange();
    }
    println!("hello world");
}